<?php

namespace app\controllers;

use Yii;
use yii\helpers\Url;
use app\Models\User;
use yii\web\Response;

class AuthController extends \yii\web\Controller
{
    // Регистрация
    public function actionRegistration()
    {
        $model = new User();
    
        // Проверяем, был ли отправлен POST-запрос
        if (Yii::$app->request->isPost) {
            $request = Yii::$app->request;
            $response = Yii::$app->response;
    
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

            // Запрос от авторизованного аккаунта
            if (!Yii::$app->user->isGuest) {
                $response->statusCode = 403;
                return $response->data = ['message' => 'Вы уже авторизованы'];
            }
    
            // Привязка данных к модели и валидация
            if ($model->load(Yii::$app->request->post(), '') && $model->validate()) {
                // Проверка наличия пользователя с таким email
                $existingUser = User::findOne(['email' => $model->email]);
                if ($existingUser !== null) {
                    $response->statusCode = 409;
                    return $response->data = ['message' => 'Аккаунт с таким email уже существует'];
                }
    
                // Создание нового пользователя
                $model->password = Yii::$app->security->generatePasswordHash($model->password); // Хешируем пароль
                if ($model->save()) {
                    // Авторизуем пользователя
                    Yii::$app->user->login($model);
                    return $this->redirect(['/accounts/' . Yii::$app->user->identity->id]);
                } else {
                    $response->statusCode = 500;
                    return $response->data = ['message' => 'Произошла ошибка при регистрации пользователя'];
                }
            } else {
                $response->statusCode = 400; // Неверный запрос
                return $response->data = $model->getErrors();
            }
        }
    
        // Если это не POST-запрос, отображаем форму регистрации
        return $this->render('registration', [
            'model' => $model,
        ]);
    }

    // Авторизация
    public function actionLogin()
    {
        $request = Yii::$app->request;
        $response = Yii::$app->response;

        if (!Yii::$app->user->isGuest) {
            $response->statusCode = 200;
            return $this->redirect(['/accounts/' . Yii::$app->user->identity->id]);
        }

        // Проверяем, был ли отправлен POST-запрос
        if (Yii::$app->request->isPost) {
        
            Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

            if (!Yii::$app->user->isGuest) {
                $response->statusCode = 409;
                return $response->data = ['message' => 'Вы уже авторизованы'];
            }

            // Получение данных из запроса
            $email = $request->getBodyParam('email');
            $password = $request->getBodyParam('password');

            // Поиск пользователя по email
            $user = User::findOne(['email' => $email]);

            // Проверка наличия пользователя и правильности пароля
            if ($user !== null && Yii::$app->security->validatePassword($password, $user->password)) {
                // Аутентификация пользователя
                Yii::$app->user->login($user);

                // Возвращаем данные пользователя в ответе
                $response->statusCode = 200;
                $response->data = ['id' => $user->id];
                return $this->redirect(['/accounts/' . Yii::$app->user->identity->id]);
            } else {
                // Неверный email или пароль
                $response->statusCode = 401;
                $response->data = ['message' => 'Email или пароль не верны'];
                return $this->redirect(['/login/']);
            }
        } else {
            // Если это не POST-запрос, отображаем форму авторизации
            $model = new User();
            return $this->render('login', [
                'model' => $model,
            ]);
        }
    }

    /**
     * Logout action.
     *
     * @return Response
     */
    public function actionLogout()
    {
        Yii::$app->user->logout();

        return $this->goHome();
    }
}